﻿using System;
using System.Data;
using SiGeCoPre.Presupuesto_BL;
using SiGeCoPre.Presupuesto_DAO;
using SiGeCoPre.Presupuesto_DTO;
using SiGeCoPre.Presupuesto_Entities;
using SiGeCoPre.Presupuesto_Factory;
using SiGeCoPre.Presupuesto_Excepcion;
using SiGeCoPre.Presupuesto_Util;

namespace SiGeCoPre.Presupuesto_BLIMPL
{
    /// <summary>
    /// Clase que implementa BLPresupuestoEquipo
    /// </summary>
    class BLIMPLPresupuestoEquipo:Presupuesto_BL.BLPresupuestoEquipo
    {
        DAOPresupuestoEquipo createPresupuestoEquipo = DAOFactoryPresupuesto.createPresupuestoEquipo();
        BLEquipo createEquipo = BLFactoryPresupuesto.createEquipo();
        BLPresupuestos createPresupuesto = BLFactoryPresupuesto.createPresupuesto();

        /// <summary>
        /// Guarda un equipo asociado a un presupuesto
        /// </summary>
        /// <param name="preEq">Objeto con los datos de un equipo asociado a un presupuesto</param>
        /// <returns>Devuelve true si fue ingresado correctamente o false si falló</returns>
        public bool savePresupuestoEquipo(presupuestoEquipoDTO preEq)
        {
            Boolean correcto = false;

            try
            {
                presupuestosDTO p = createPresupuesto.getPresupuesto(preEq.CodigoPresupuesto);
                if (null != p)
                {
                    Boolean insertado = createPresupuestoEquipo.savePresupuestoEquipo(p.ID, preEq.IdEquipo);

                    if (insertado)
                    {
                        correcto = true;
                    }    
                }
                
            }
            catch (Exception ex)
            {

                correcto = false;
                Texto.escribirLog(ex.Message);
                throw new BLException(ex.Message);
            }

            return correcto;
        }

        /// <summary>
        /// Modifica un equipo asociado a un presupuesto
        /// </summary>
        /// <param name="preEq">Objeto con los datos de un equipo asociado a un presupuesto</param>
        /// <param name="id">Determina el presupuesto a modificar</param>
        /// <returns>Devuelve true si fue modificado correctamente o false si falló</returns>
        public bool updatePresupuestoEquipo(presupuestoEquipoDTO preEq, int id)
        {
            Boolean correcto = false;

            try
            {
                presupuestosDTO p = createPresupuesto.getPresupuesto(preEq.CodigoPresupuesto);

                if (null != p)
                {
                    Boolean modificado = createPresupuestoEquipo.updatePresupuestoEquipo(p.ID, preEq.IdEquipo, id);

                    if (modificado)
                    {
                        correcto = true;
                    }    
                }
                
            }
            catch (Exception ex)
            {

                correcto = false;
                Texto.escribirLog(ex.Message);
                throw new BLException(ex.Message);
            }

            return correcto;
        }

        /// <summary>
        /// Elimina un presupuesto y su equipo asociado
        /// </summary>
        /// <param name="id">Determina el presupuesto a eliminar</param>
        /// <returns>Devuelve true si fue eliminado correctamente o false si falló</returns>
        public bool deletePresupuestoEquipo(int id)
        {
            Boolean correcto = false;

            try
            {
                Boolean eliminado = createPresupuestoEquipo.deletePresupuestoEquipo(id);

                if (eliminado)
                {
                    correcto = true;
                }
            }
            catch (Exception ex)
            {

                correcto = false;
                Texto.escribirLog(ex.Message);
                throw new BLException(ex.Message);
            }

            return correcto;
        }

        /// <summary>
        /// Lista los presupuestos de equipo
        /// </summary>
        /// <returns>Devuelve una tabla con todos los presupuestos</returns>
        public DataTable getAllPresupuestoEquipo()
        {
            DataTable listadoPresupuestoEquipos = null;

            try
            {
                DataTable preEq = createPresupuestoEquipo.getAllPresupuestoEquipo();

                if (null != preEq)
                {
                    listadoPresupuestoEquipos = preEq;
                }
            }
            catch (Exception ex)
            {

                listadoPresupuestoEquipos = null;
                Texto.escribirLog(ex.Message);
                throw new BLException(ex.Message);
            }

            return listadoPresupuestoEquipos;
        }

        /// <summary>
        /// Obtiene un presupuesto de equipo
        /// </summary>
        /// <param name="codigoPresupuesto">Determina el presupuesto a obtener</param>
        /// <returns>Devuelve un objeto presupuesEquipo</returns>
        public presupuestoEquipoDTO getPresupuestoEquipo(string codigoPresupuesto)
        {
            presupuestoEquipoDTO pe = null;

            try
            {
                presupuestoEquipo preEq = createPresupuestoEquipo.getPresupuestoEquipo(codigoPresupuesto);

                if (null != preEq)
                {
                    pe = new presupuestoEquipoDTO();
                    pe.CodigoPresupuesto = preEq.CodigoPresupuesto;
                    pe.EstadoPresupuesto = preEq.EstadoPresupuesto;
                    pe.Fecha = preEq.Fecha;
                    pe.IdEquipo = preEq.IdEquipo;
                    pe.Precio = preEq.Precio;
                    pe.TipoEquipo = preEq.TipoEquipo;
                }
            }
            catch (Exception ex)
            {

                pe = null;
                Texto.escribirLog(ex.Message);
                throw new BLException(ex.Message);
            }

            return pe;
        }
    }
}
